package cn.iocoder.yudao.module.infra.service.codeincrement;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.constant.ConstantUtil;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.infra.code.SequenceRuleConstant;
import cn.iocoder.yudao.module.infra.controller.admin.codeincrement.vo.CodeIncrementPageReqVO;
import cn.iocoder.yudao.module.infra.controller.admin.codeincrement.vo.CodeIncrementSaveReqVO;
import cn.iocoder.yudao.module.infra.dal.dataobject.codeincrement.CodeIncrementDO;
import cn.iocoder.yudao.module.infra.dal.mysql.codeincrement.CodeIncrementMapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.CODE_INCREMENT_NOT_EXISTS;

/**
 * code自增号 Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
public class CodeIncrementServiceImpl implements CodeIncrementService {

    @Resource
    private CodeIncrementMapper codeIncrementMapper;

    @Override
    public Long createCodeIncrement(CodeIncrementSaveReqVO createReqVO) {
        // 插入
        CodeIncrementDO codeIncrement = BeanUtils.toBean(createReqVO, CodeIncrementDO.class);
        codeIncrementMapper.insert(codeIncrement);
        // 返回
        return codeIncrement.getId();
    }

    @Override
    public void updateCodeIncrement(CodeIncrementSaveReqVO updateReqVO) {
        // 校验存在
        validateCodeIncrementExists(updateReqVO.getId());
        // 更新
        CodeIncrementDO updateObj = BeanUtils.toBean(updateReqVO, CodeIncrementDO.class);
        codeIncrementMapper.updateById(updateObj);
    }

    @Override
    public void deleteCodeIncrement(Long id) {
        // 校验存在
        validateCodeIncrementExists(id);
        // 删除
        codeIncrementMapper.deleteById(id);
    }

    private void validateCodeIncrementExists(Long id) {
        if (codeIncrementMapper.selectById(id) == null) {
            throw exception(CODE_INCREMENT_NOT_EXISTS);
        }
    }

    @Override
    public CodeIncrementDO getCodeIncrement(Long id) {
        return codeIncrementMapper.selectById(id);
    }

    @Override
    public PageResult<CodeIncrementDO> getCodeIncrementPage(CodeIncrementPageReqVO pageReqVO) {
        return codeIncrementMapper.selectPage(pageReqVO);
    }

    @Override
    public String getSpuAndSkuCode(String spu) {
        CodeIncrementDO codeIncrementDOs = new CodeIncrementDO();
        codeIncrementDOs.setBizKey(spu);
        codeIncrementMapper.updateSpuAndSkuCode(codeIncrementDOs);
        Integer code = codeIncrementDOs.getInrValue();
        if(ConstantUtil.SPU.equals(spu)){
            String spuCode = String.format(SequenceRuleConstant.REDIS_DEFAULT_DIGIT_FORMAT_SPU, code);
            //新增spu编码
            CodeIncrementDO infraCodeIncrementDO = new CodeIncrementDO();
            infraCodeIncrementDO.setBizKey(spuCode);
            infraCodeIncrementDO.setInrValue(0);
            infraCodeIncrementDO.setRemark("SPU编码");
            infraCodeIncrementDO.setDeleted(false);
            infraCodeIncrementDO.setTenantId(1L);
            codeIncrementMapper.insert(infraCodeIncrementDO);
            return spuCode;
        }else {
            return String.format(SequenceRuleConstant.REDIS_DEFAULT_DIGIT_FORMAT_SKU, code);
        }
    }

    @Override
    public String getDeliveryPersonCode(String key) {
        CodeIncrementDO codeIncrementDOs = new CodeIncrementDO().setBizKey(key);
        codeIncrementMapper.updateSpuAndSkuCode(codeIncrementDOs);
        return String.valueOf(codeIncrementDOs.getInrValue());
    }

}